package com.kkd.kkdapp.view;

import com.kkd.kkdapp.R;
import com.kkd.kkdapp.utils.LogUtil;
import com.kkd.kkdapp.utils.SystemUtils;
import com.kkd.kkdapp.view.RiseProgressBar.EndListener;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.animation.Animator.AnimatorListener;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * 
 * 
 * 饼图类
 * 
 */
public class MyHalfRoundProgressBar extends View {
	/**
	 * 画笔对象的引用
	 */
	private Paint paint;
	private Paint paint2;
	private static final int[] SECTION_COLORS = { Color.parseColor("#ffd207"),
			Color.parseColor("#e6e6e6") };

	/**
	 * 圆环的颜色
	 */
	private int roundColor;

	/**
	 * 圆环进度的颜色
	 */
	private int roundProgressColor;

	/**
	 * 中间进度百分比的字符串的颜色
	 */
	private int textColor;

	/**
	 * 中间进度百分比的字符串的字体
	 */
	private float textSize;
	/**
	 * 圆环的宽度
	 */
	private float roundWidth;

	/**
	 * 最大进度
	 */
	private int max;

	/**
	 * 当前进度
	 */
	private int progress;
	/**
	 * 是否显示中间的进度
	 */
	private boolean textIsDisplayable;

	/**
	 * 是否显示中间的进度
	 */
	private double interestRate = 50;
	/**
	 * 进度的风格，实心或者空心
	 */
	private int style;

	public static final int STROKE = 0;
	public static final int FILL = 1;

	public MyHalfRoundProgressBar(Context context) {
		this(context, null);
	}

	public MyHalfRoundProgressBar(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public MyHalfRoundProgressBar(Context context, AttributeSet attrs,
			int defStyle) {
		super(context, attrs, defStyle);

		paint = new Paint();
		paint2 = new Paint();

		TypedArray mTypedArray = context.obtainStyledAttributes(attrs,
				R.styleable.RoundProgressBar);

		// 获取自定义属性和默认值
		roundColor = mTypedArray.getColor(
				R.styleable.RoundProgressBar_roundColor,
				Color.parseColor("#f2f2f2"));
		roundProgressColor = mTypedArray.getColor(
				R.styleable.RoundProgressBar_roundProgressColor,
				Color.parseColor("#f5d9c2"));
		textColor = mTypedArray.getColor(
				R.styleable.RoundProgressBar_textColor,
				Color.parseColor("#ff3600"));
		textSize = mTypedArray.getDimension(
				R.styleable.RoundProgressBar_textSize, 150);
		roundWidth = mTypedArray.getDimension(
				R.styleable.RoundProgressBar_roundWidth,
				SystemUtils.dip2px(getContext(), 34));
		max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max1, 100);
		textIsDisplayable = mTypedArray.getBoolean(
				R.styleable.RoundProgressBar_textIsDisplayable, true);
		style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);

		mTypedArray.recycle();
	}

	private int sw = 0;

	public void setSw(int sw) {
		this.sw = sw;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		/**
		 * 画最外层的大圆环
		 */
		int centre = getWidth() / 2; // 获取圆心的x坐标
		int radius = (int) (centre - roundWidth / 2 - SystemUtils.dip2px(
				getContext(), 2f)); // 圆环的半径
		paint.setColor(roundProgressColor); // 设置圆环的颜色
		paint.setStyle(Paint.Style.STROKE); // 设置空心
		paint.setStrokeWidth(roundWidth); // 设置圆环的宽度
		paint.setAntiAlias(true); // 消除锯齿
		// paint.setStrokeCap(Paint.Cap.ROUND);
		// canvas.drawCircle(centre, centre, radius, paint); // 画出圆环
		RectF oval = new RectF(centre - radius, centre - radius, centre
				+ radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
		canvas.drawArc(oval, 180, 180, false, paint); // 根据进度画圆弧
		Log.e("log", centre + "");

		/**
		 * 画圆弧 ，画圆环的进度
		 */

		// 设置进度是实心还是空心
		int[] colors = new int[2];
		System.arraycopy(SECTION_COLORS, 0, colors, 0, 2);
		LinearGradient shader = new LinearGradient(centre - (radius), centre,
				centre + (radius), centre, colors, null, Shader.TileMode.CLAMP);
		paint2.setColor(roundColor); // 设置圆环的颜色
		paint2.setStyle(Paint.Style.STROKE); // 设置空心
		paint2.setStrokeWidth(roundWidth); // 设置圆环的宽度
		paint2.setAntiAlias(true); // 消除锯齿
		paint2.setStrokeWidth(roundWidth); // 设置圆环的宽度
		// paint2.setStrokeCap(Paint.Cap.ROUND);
		// paint.setColor(roundProgressColor); // 设置进度的颜色
		// paint2.setShader(shader);
		switch (style) {
		case STROKE: {
			paint.setStyle(Paint.Style.STROKE);
			canvas.drawArc(oval, 0, -180 * progress / max, false, paint2); // 根据进度画圆弧
			break;
		}
		case FILL: {
			paint.setStyle(Paint.Style.FILL_AND_STROKE);
			if (progress != 0)
				canvas.drawArc(oval, 180, 180 * progress / max, true, paint2); // 根据进度画圆弧
			break;
		}
		}
		// if (sw <= 180 * progress / max) {
		// sw += 2;
		// invalidate();
		// }
	}

	public synchronized int getMax() {
		return max;
	}

	/**
	 * 设置进度的最大值
	 * 
	 * @param max
	 */
	public synchronized void setMax(int max) {
		if (max < 0) {
			throw new IllegalArgumentException("max not less than 0");
		}
		this.max = max;
	}

	/**
	 * 获取进度.需要同步
	 * 
	 * @return
	 */
	public synchronized int getProgress() {
		return progress;
	}

	/**
	 * 设置进度，此为线程安全控件，由于考虑多线的问题，需要同步 刷新界面调用postInvalidate()能在非UI线程刷新
	 * 
	 * @param progress
	 */
	public synchronized void setProgress(int progress) {
		sw = 0;
		if (progress < 0) {
			throw new IllegalArgumentException("progress not less than 0");
		}
		if (progress > max) {
			progress = max;
		}
		if (progress <= max) {
			this.progress = progress;
			postInvalidate();
		}

	}

	public int getCricleColor() {
		return roundColor;
	}

	public void setCricleColor(int cricleColor) {
		this.roundColor = cricleColor;
	}

	public int getCricleProgressColor() {
		return roundProgressColor;
	}

	public void setCricleProgressColor(int cricleProgressColor) {
		this.roundProgressColor = cricleProgressColor;
	}

	public int getTextColor() {
		return textColor;
	}

	public void setTextColor(int textColor) {
		this.textColor = textColor;
	}

	public float getTextSize() {
		return textSize;
	}

	public void setTextSize(float textSize) {
		this.textSize = textSize;
	}

	public float getRoundWidth() {
		return roundWidth;
	}

	public void setRoundWidth(float roundWidth) {
		this.roundWidth = roundWidth;
	}

	public double getInterestRate() {
		return interestRate;
	}

	public void setInterestRate(double interestRate) {
		this.interestRate = interestRate;
	}

	private float fromProgress;
	private static final int RUNNING = 1;
	private int mPlayingState = STOPPED;
	private static final int STOPPED = 0;
	private ValueAnimator valueAnimator;
	private long duration = 1500;
	private EndListener mEndListener = null;
	private int mProgress;

	public interface EndListener {
		public void onEndFinish();
	}

	public boolean isRunning() {
		return (mPlayingState == RUNNING);
	}

	private void runInt() {
		valueAnimator = ValueAnimator
				.ofInt((int) fromProgress, (int) mProgress);
		valueAnimator.setDuration(duration);

		valueAnimator
				.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
					@Override
					public void onAnimationUpdate(ValueAnimator valueAnimator) {

						setProgress((Integer) valueAnimator.getAnimatedValue());
						LogUtil.e("setProgress",
								(Integer) valueAnimator.getAnimatedValue() + "");
						invalidate();
						if (valueAnimator.getAnimatedFraction() >= 1) {
							mPlayingState = STOPPED;
							if (mEndListener != null)
								mEndListener.onEndFinish();
						}
					}
				});
		valueAnimator.start();
		valueAnimator.addListener(new AnimatorListener() {

			@Override
			public void onAnimationStart(Animator animation) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onAnimationRepeat(Animator animation) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onAnimationEnd(Animator animation) {
				fromProgress = progress;
			}

			@Override
			public void onAnimationCancel(Animator animation) {
				// TODO Auto-generated method stub

			}
		});
	}

	public void start() {

		if (!isRunning()) {
			mPlayingState = RUNNING;
			runInt();
		}
	}

	public MyHalfRoundProgressBar setDuration(long duration) {
		this.duration = duration;
		return this;
	}

	public void setOnEnd(EndListener callback) {
		mEndListener = callback;
	}

	public MyHalfRoundProgressBar withNumber(int number) {
		this.mProgress = number;
		return this;

	}
}